#include <iostream>
#include <cstdio>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>

const std::string myenv="HELLO=AAAAAAAAAAAAAAAAAAA";
extern char **environ;
int main()
{
    putenv((char*)myenv.c_str()); 
    pid_t id = fork();
    if(id == 0) //子进程作程序替换
    {     
        char *const argv[]= {
            (char*)"other1",
            nullptr
        };  
        //(void) argv;
        
        char *const env[] = {
            (char*)"HELLO=bite",
            (char*)"HELLO1=bite1",
            (char*)"HELLO2=bite2",
            (char*)"HELLO3=bite3",
            (char*)"other"
        };

        //execl("./other1", "other1", nullptr); //拿到环境变量
        
        // 手动传环境变量
        //execvpe("./other1", argv, env);
        execvpe("./other1", argv, environ);
        exit(1);
    }

    pid_t rid = waitpid(id, nullptr, 0); //父进程对子进程进行等待
    if(rid > 0) {
        printf("等待子进程成功!\n");
    }
    return 0;
}


// int main3()
// {
//     pid_t id = fork();
//     if(id == 0) //子进程作程序替换
//     {
//         char *const argv[]= {
//             (char*)"ls",
//             (char*)"--color",
//             (char*)"-a",
//             (char*)"-l",
//             nullptr
//         };
        
       
//         (void) argv;

//         //execvp("ls", argv);
//         //execvp("argv[0]", argv);

//         //execlp("ls", "ls", "--color", "-a", "-l", nullptr);
//         //execlp("ls", "ls", "--color", "-aln", nullptr);

//         //execv("usr/bin/ls", argv);
        
//         //execl("/bin/ls", "ls", "-l", "--color", "-a", nullptr);


//         // 执行当前目录的脚本文件
//         // 程序替换并不是这个文件，文件只是一个选项，替换的是解释器
//         //execl("/usr/bin/python", "python", "test.py", nullptr);  //python 脚本
//         //execl("/usr/bin/bash", "bash", "test.sh", nullptr);  //shell 脚本


//         exit(1);
//     }

//     pid_t rid = waitpid(id, nullptr, 0); //父进程对子进程进行等待
//     if(rid > 0)
//     {
//         printf("等待子进程成功!\n");
//     }

//     return 0;
// }

// int main2()
// {
//     printf("我是myexec, pid: %d\n", getpid());
//    // execl("./other", "other", nullptr);

//     int n = execl("/bin/ls", "ls", "-l", "-color", "-a", nullptr);
//     printf("execl return val: %d\n", n); 

//     return 0;
// }




// int main1()
// {
//     //execl("/bin/ls", "ls", "-l", "-a", nullptr);
//     //execl("/usr/bin/top", "top", nullptr);
//     return 0;
// }
